(function ($) {
    //$为插件定义私有作用域，外部代码不能直接访问插件内部的代码，插件内部的代码不污染全局变量
    //广告图轮换插件

    //对象级别插件，开发扩展方法是使用$.fn.extend;

    /**
     *调用方法 $(".banner").slide({});
     * @type {{
      * container: string,       轮播函数的父容器
      * items: string,           子容器放置每个轮播块的内容
      * itemsLength: number,        轮播的块数量
      * scrollWidth: number,      单位轮播块的宽度
      * prevSelector: string,       向前翻页选择器
      * nextSelector: string,       向后翻页选择器
      * pointer: string,            导航条选择器
      * speed: number,              画面进入时间
      * auto: number,               画面更换时间
      * autoDirection: string,      切换方式,方向
      * extend: null
      * }}
     */
    var defaults = {
        container: ".banner ul",
        items: "li",
        //itemWidth:0,
        itemsLength: 0,
        scrollWidth: 0,
        prevSelector: ".prev",
        nextSelector: ".next",
        pointer: ".dots",
        speed: 600,
        auto: 4000,
        autoDirection: "next",
        extend: null

    }
    $.fn.slide = function (options) {
        var options = $.extend(options, defaults),
            cont = $(options.container),
            itemsLength = options.itemsLength ? options.itemsLength : cont.find(options.items).length,
            parentWidth = (itemsLength + 1) * 100 + "%",
            itemWidth = 100 / (itemsLength + 1) + "%";

        //只有一张图片轮换的时候隐藏向前向后按钮且不处理图片切换效果
        if (itemsLength <= 1) {
            typeof defaults.extend == "function" && defaults.extend("failed");
            options.prevSelector && $(options.prevSelector).hide();
            options.nextSelector && $(options.nextSelector).hide();
            return this;
        }


        cont.find(options.items).last().clone(true).prependTo(cont);
        cont.css({"width": parentWidth});
        cont.find(options.items).css({"width": itemWidth});

        /*动态创建翻页导航条*/
        for (var i = 0; i < itemsLength; i++) {
            var num = i + 1;
            $(options.pointer).append("<li>" + num + "</li>");
        }


        var canDo = true, index, timer = options.speed || 600, dots = $(options.pointer).find("li");
        dots.eq(0).addClass("cur");

        //翻页导航点击事件
        dots.on("click", function () {
            if (!canDo) return;
            canDo = false;
            var _index = $(this).index(),
                left = -(_index + 1) * 100;
            dots.removeClass().eq(_index).addClass("cur");
            cont.animate({"left": left + "%"}, timer, function () {
                canDo = true;
            });
        });

        //向前
        options.prev = function () {
            if (!canDo) return;
            canDo = false;
            var left = parseInt(cont.get(0).style.left ? cont.get(0).style.left.replace("%", "") : 0);
            if (left == 0) {
                left = -itemsLength * 100;
                cont.animate({"left": left + "%"}, 0, function () {
                    canDo = true;
                });
            }
            if (left < 0) {
                left += 100;
                index = Math.abs(left / 100) - 1;
                dots.removeClass("cur").eq(index).addClass("cur");
                cont.animate({"left": left + "%"}, timer, function () {
                    canDo = true;
                });
            }

        }

        //向后
        options.next = function () {
            console.log(canDo)
            if (!canDo) return;
            canDo = false;
            var left = parseInt(cont.get(0).style.left ? cont.get(0).style.left.replace("%", "") : 0);

            if (left > -itemsLength * 100) {
                left = left - 100;
                index = Math.abs(left / 100) - 1;
                dots.removeClass("cur").eq(index).addClass("cur");
                cont.animate({"left": left + "%"}, timer, function () {
                    canDo = true;
                    if (left == -itemsLength * 100) {
                        cont.css({"left": 0 + "%"})
                    }
                });
            }

        }
        cont.mouseenter(function () {
            canDo = false;
        }).mouseleave(function () {
            canDo = true;
        })
        options.prevSelector && this.find(options.prevSelector).click(options.prev);
        options.nextSelector && this.find(options.nextSelector).click(options.next);
        typeof options.auto == "number" && options.auto > 0 && setInterval(options[options.autoDirection], options.auto);
        typeof options.extend == "function" && options.extend(options);
        return this;
    }

})(jQuery)